<?php
/* 
 * 2016年11月8日 星期二
 * 通过xml配置文件创建app
*/
namespace hyang;
use hyang\Xml;
class Build
{
    const logName = "report.log";// 文件日志名称
    public $xfile = '';         // xml 文件-可扩展其他配置文件
    public $option = array();
    public $tpldir;             // 模板目录
    public $targetdir;          // 文件复制模板
    public $filehead = "";      // 文件头部声明
    public function __construct($file=null)
    {
        $this->init($file);
    }
    public function init($file=null)
    {
        if(is_file($file)){
            $this->xfile = $file;
            $doc = new Xml($file);
            if($doc->hasElement('tpldir')) $this->tpldir = $doc->select('tpldir')->text();
            if($doc->hasElement('targetdir')) $this->tpldir = $doc->select('targetdir')->text();
            if($doc->hasElement('app')){
                $data = $doc->select('app')->first()->attr();
                if(isset($data['tpldir'])) $this->tpldir = $data['tpldir'];
                if(isset($data['tpldir'])) $this->targetdir = $data['targetdir'];
            }
            if($doc->hasElement('filelist')){
                $this->option = $doc->select('filelist')->children()->childAttr();
            }
            if($doc->hasElement('head')){
                $head = $doc->select('head')->text();
                $data = $doc->select('declare')->children()->childText();
                foreach($data as $k=>$v)
                {
                    if($k == 'date') $v = date('Y-m-d H:i:s'); 
                    if($v) $head = str_replace('{$'.$k.'}',$v,$head);
                }
                $this->filehead = $head;
            }
        }
        
    }
    // 生成文件
    public function create($name,$feek=false,$remove=false)
    {
        $file = '';$tpl = '';
        $tpldir = $this->tpldir? $this->tpldir:'';
        $targetdir = $this->targetdir? $this->targetdir:'';
        $report = '';
        $ret = [];
        foreach($this->option as $k=>$v)
        {
            if(isset($v['target'])) $file = $targetdir.(str_replace('{$name}',$name,$v['target']).'.'.$k);
            // 删除文件模板
            if($remove){
                $tmp = '<br>文件-< '.$file.' >-删除-';           
                if(is_file($file) && unlink($file)) $tmp .= "成功";
                else $tmp .= "失败；可能模板不存在/文件已经删除失败";
                $report .= $tmp;
                $ret[$file] = $report;
            }
            else{// 生成文件                
                $tpl = $tpldir.(isset($v['tpl']) && !empty($v['tpl'])? $v['tpl']:'tpl').'.'.$k; 
                if(is_file($tpl)){
                    if(copy($tpl,$file)){
                        $str = str_replace('{$head}',$this->filehead,file_get_contents($file));
                        file_put_contents($file,$str);
                        $ret[$file] = '文件通过复制模板已经成功生成文件'; 
                        $report .= '<br><'.$file.'> 文件通过复制模板已经成功生成文件';
                    }
                    else{
                        $ret[$file] = '文件复制失败';
                        $report .= '<br><'.$file.'> 模板文件复制失败';
                    } 
                }
                else{
                    if($k == 'php'){
                        if(file_put_contents($file,"<php?\r\n/*".$this->filehead."*/\r\n")){
                            $ret[$file] = 'php 文件已经成功生成';
                            $report .= '<br><'.$file.'> php文件已经成功生成！';
                        }
                        else{
                            $ret[$file] = 'php 文件生成-失败';
                            $report .= '<br><'.$file.'> php文件生成-失败';
                        }
                    }
                    elseif($k == 'js'){
                        if(file_put_contents($file,"\r\n/*".$this->filehead."*/\r\n")){
                            $ret[$file] = 'js 文件已经成功生成';
                            $report .= '<br><'.$file.'> js文件已经成功生成！';
                        }
                        else{
                            $ret[$file] = 'js 文件生成-失败';
                            $report .= '<br><'.$file.'> js文件生成-失败';
                        }
                    }
                    elseif($k == 'css'){
                        if(file_put_contents($file,"\r\n/*".$this->filehead."*/\r\n")){
                            $ret[$file] = 'css 文件已经成功生成';
                            $report .= '<br><'.$file.'> css文件已经成功生成！';
                        }
                        else{
                            $ret[$file] = 'css 文件生成-失败';
                            $report .= '<br><'.$file.'> css文件生成-失败';
                        }
                    }
                    elseif($k == 'html'){
                        if(file_put_contents($file,'')){
                            $ret[$file] = 'html 文件已经成功生成';
                            $report .= '<br><'.$file.'> html文件已经成功生成！';
                        }
                        else{
                            $ret[$file] = 'html 文件生成-失败';
                            $report .= '<br><'.$file.'> html文件生成-失败';
                        }
                    }
                }
            }            
        }
        $this->fileAppend($tpldir.(self::logName),"\r\n\r\nBuild/createTpl__文件生成/删除（".date('Y-m-d H:i:s')."）：".str_replace('<br>',"\r\n",$report));
        if($feek) return $ret;        
        return $report;
    }
    // 删除文件模板
    public function remove($name,$feek=false)
    {
        return $this->create($name,$feek,true);
    }
    // 更具配置文件生成 tpl
    public function createTpl($feek=false,$removeTpl=false)
    {
        $tpldir = $this->tpldir? $this->tpldir:'';
        $tplArr = [];
        $report = '';
        foreach($this->option as $k=>$v)
        {
            $tpl = $tpldir.(isset($v['tpl']) && !empty($v['tpl'])? $v['tpl']:'tpl').'.'.$k;
            if($removeTpl){
                $report .= '<br>文件模板-删除-';           
                if(is_file($tpl) && unlink($tpl)) $report .= "成功";
                else $report .= "失败；可能模板不存在/文件已经删除失败";
            }
            else{
                if(!is_file($tpl)){
                    if(@file_put_contents($tpl,'')){
                        $tplArr[] = $tpl;
                        $report .= '<br>模板 <'.$tpl.'> 成功生成';
                    }
                    else $report .= '<br>模板 <'.$tpl.'> 无法生成，可能是目录不存在';
                }
                else $report .= '<br>模板 <'.$tpl.'> 已经存在，无须重复生成';
            }
        }
        $this->fileAppend($tpldir.(self::logName),"\r\nBuild/createTpl__模板生成报告（".date('Y-m-d H:i:s')."）：\r\n".str_replace('<br>',"\r\n",$report));
        if($feek) return $tplArr;        
        return $report;
    }
    // 删除 tpl 模板
    public function removeTpl($feek=false)
    {
        return $this->createTpl($feek,true);
    }
    public function fileAppend($file,$report)
    {
        $fh = fopen($file,'a');
        $success = fwrite($fh,$report);
        fclose($fh);
        return $success;
    }
}